/**
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trim.gui.testing;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import trim.Trim;
import trim.pl.PlaginLoader;
import trim.pl.TrimPlagin;
import trim.scripting.interfaces.IPlaginManager;

/**
 *
 * @author Дмитрий
 */
public class PlaginManager implements IPlaginManager<Trim>
{

  private Trim[] methods=new Trim[0];
  private boolean[] used=new boolean[0];
  private PlaginLoader plaginLoader;

  public PlaginManager()
  {
    plaginLoader=new PlaginLoader();
    File f=new File("."+File.separator+"plagins.config");
    if(f.exists())
    {
      BufferedReader r=null;
      try
      {
        r=new BufferedReader(new FileReader(f));
        String s;
        while((s=r.readLine())!=null)
        {
          loadPlagin(s);
        }
        r.close();
      }catch(Exception ex)
      {
        ex.printStackTrace();
      }finally
      {
        try
        {
          r.close();
        }catch(IOException ex)
        {
          Logger.getLogger(PlaginManager.class.getName()).log(Level.SEVERE,null,ex);
        }
      }
    }
  }

  public TrimPlagin getPlagin(int index)
  {
    return plaginLoader.getPlagin(index);
  }

  /**
   * Количество загруженных плагинов
   * @return Количество загруженных плагинов
   */
  public int getPlaginCount()
  {
    return plaginLoader.getPlaginCount();
  }

  public void loadPlagin(String fileName)
  {
    loadPlagin(new File(fileName));
  }

  /**
   * Загрузка нового плагина
   * @param jarFile библиотека алгиритмов
   */
  public void loadPlagin(File jarFile)
  {
    TrimPlagin trimClassLoader=plaginLoader.loadPlagin(jarFile);
    Trim[] nm=new Trim[methods.length+trimClassLoader.getMethodCount()];
    int n=methods.length;
    System.arraycopy(methods,0,nm,0,n);
    for(Trim t:trimClassLoader.getMethods())
      nm[n++]=t;
    methods=nm;
    used=new boolean[methods.length];
    Arrays.fill(used,false);

  }

  /**
   * Количество загруженных алгоритмов (методов решения)
   * @return
   */
  public int getMethodsCount()
  {
    return plaginLoader.getMethodCount();
  }

  public boolean isMethodUsed(int i)
  {
    return used[i];
  }

  public void removePlagin(int i)
  {
    plaginLoader.removePlagin(i);
  }

  public void setMethodUsed(int i,boolean used)
  {
    this.used[i]=used;
  }

  public List<Trim> getUsedMethods()
  {
    List<Trim> res=new ArrayList();
    for(int i=0;i<methods.length;i++)
    {
      if(used[i])
        res.add(methods[i]);
    }
    return res;
  }

  public Trim getMethod(int i)
  {
    return methods[i];
  }

  public Trim getMethod(String className) throws ClassNotFoundException
  {
    return plaginLoader.getMethod(className);
  }

  public File getPlaginFile(int i)
  {
    return plaginLoader.getPlagin(i).getFile();
  }

  public void savePlagins() throws IOException
  {
    File f=new File("."+File.separator+"plagins.config");
    BufferedWriter w=new BufferedWriter(new FileWriter(f));
    for(TrimPlagin cl:plaginLoader.getPlagins())
    {
      w.write(cl.getFile().getCanonicalPath());
      w.write("\n");
    }
    w.close();
  }

  public int getMethodCount()
  {
    return plaginLoader.getMethodCount();
  }
}
